package com.wondertek.onvif.common;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

/**
 * 统一API响应结果封装类
 * 
 * @author wondertek
 * @version 1.0.0
 * @param <T> 数据类型
 */
public class ResultBean<T> {
    
    /**
     * 响应状态码
     * 200: 成功
     * 400: 客户端错误
     * 500: 服务器错误
     */
    private Integer code;
    
    /**
     * 响应消息
     */
    private String msg;
    
    /**
     * 响应数据
     */
    private T data;
    
    /**
     * 默认构造函数
     */
    public ResultBean() {
    }
    
    /**
     * 全参构造函数
     */
    public ResultBean(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    
    public Integer getCode() {
        return code;
    }
    
    public void setCode(Integer code) {
        this.code = code;
    }
    
    public String getMsg() {
        return msg;
    }
    
    public void setMsg(String msg) {
        this.msg = msg;
    }
    
    public T getData() {
        return data;
    }
    
    public void setData(T data) {
        this.data = data;
    }
    
    /**
     * 成功响应（带数据）
     * 
     * @param data 响应数据
     * @param <T> 数据类型
     * @return ResultBean
     */
    public static <T> ResultBean<T> success(T data) {
        return new ResultBean<>(200, "操作成功", data);
    }
    
    /**
     * 成功响应（带数据和自定义消息）
     * 
     * @param data 响应数据
     * @param msg 响应消息
     * @param <T> 数据类型
     * @return ResultBean
     */
    public static <T> ResultBean<T> success(T data, String msg) {
        return new ResultBean<>(200, msg, data);
    }
    
    /**
     * 成功响应（无数据）
     * 
     * @return ResultBean
     */
    public static <T> ResultBean<T> success() {
        return new ResultBean<>(200, "操作成功", null);
    }
    
    /**
     * 成功响应（无数据，自定义消息）
     * 
     * @param msg 响应消息
     * @return ResultBean
     */
    public static <T> ResultBean<T> success(String msg) {
        return new ResultBean<>(200, msg, null);
    }
    
    /**
     * 失败响应
     * 
     * @param msg 错误消息
     * @param <T> 数据类型
     * @return ResultBean
     */
    public static <T> ResultBean<T> error(String msg) {
        return new ResultBean<>(400, msg, null);
    }
    
    /**
     * 失败响应（自定义状态码）
     * 
     * @param code 状态码
     * @param msg 错误消息
     * @param <T> 数据类型
     * @return ResultBean
     */
    public static <T> ResultBean<T> error(Integer code, String msg) {
        return new ResultBean<>(code, msg, null);
    }
    
    /**
     * 失败响应（带数据）
     * 
     * @param msg 错误消息
     * @param data 响应数据
     * @param <T> 数据类型
     * @return ResultBean
     */
    public static <T> ResultBean<T> error(String msg, T data) {
        return new ResultBean<>(400, msg, data);
    }
    
    /**
     * 失败响应（自定义状态码和数据）
     * 
     * @param code 状态码
     * @param msg 错误消息
     * @param data 响应数据
     * @param <T> 数据类型
     * @return ResultBean
     */
    public static <T> ResultBean<T> error(Integer code, String msg, T data) {
        return new ResultBean<>(code, msg, data);
    }
    
    /**
     * 服务器内部错误
     * 
     * @param msg 错误消息
     * @param <T> 数据类型
     * @return ResultBean
     */
    public static <T> ResultBean<T> serverError(String msg) {
        return new ResultBean<>(500, msg, null);
    }
    
    /**
     * 参数错误
     * 
     * @param msg 错误消息
     * @param <T> 数据类型
     * @return ResultBean
     */
    public static <T> ResultBean<T> badRequest(String msg) {
        return new ResultBean<>(400, msg, null);
    }
    
    /**
     * 资源未找到
     * 
     * @param msg 错误消息
     * @param <T> 数据类型
     * @return ResultBean
     */
    public static <T> ResultBean<T> notFound(String msg) {
        return new ResultBean<>(404, msg, null);
    }
    
    /**
     * 判断是否成功
     * 
     * @return 是否成功
     */
    public boolean isSuccess() {
        return this.code != null && this.code == 200;
    }
}